#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {
  int pid, i;
  int group1, group2;

  // 设置父进程为组长 
  setpgid(getpid(), getpid());
  group1 = getpgid(getpid());

  for (i = 1; i <= 3; ++i) {
    pid = fork();
    if (pid == 0) {
      // child
      if (i == 1) {
        // 如果 group1 根本不存在，就会出问题。
        // 比如进程 0 已经运行结束，所以在父进程中同样要进行一次设置。
        setpgid(getpid(), group1);
      }
      else if (i == 2) {
        setpgid(getpid(), getpid());
        group2 = getpgid(getpid());
      }
      else if (i == 3) {
        // 试想如果进程 2 还没运行，进程 3 先运行了，这时候 group2 还未进行设置，这里就会有问题。
        // 或者进程 2 已经结束，那进程 3 的设置就会失败
        // 所以，父进程中同样要进行一次设置。
        setpgid(getpid(), group2);
      }
      break;
    }
    else if (pid < 0) {
      perror("fork");
      return -1;
    }
  }

  printf("进程 %d, pid: %d -> ppid: %d, pgid: [%d], (%s)\n", i%4, getpid(), getppid(), getpgid(getpid()), strerror(errno));

  while(1) sleep(1);

  return 0;
}
